物联网MQTT—订阅主题
点击上方“果果小师弟”,选择“置顶/星标公众号”
干货福利,第一时间送达!
1.固定报头
2.可变报头
3.有效载荷
订阅主题:
相应的16进制:
2F 73 79 73 2F 61 31 30 7A 77 6B 55 78 51 55 53 2F 4C 59 2D 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74
共48个(0x30)
也就是
00 30 2F 73 79 73 2F 61 31 30 7A 77 6B 55 78 51 55 53 2F 4C 59 2D 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74后面加00(QoS等级)
00 30 2F 73 79 73 2F 61 31 30 7A 77 6B 55 78 51 55 53 2F 4C 59 2D 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 00加上固定报头82 ?? 和可变报头00 0A
82 ?? 00 0A 00 30 2F 73 79 73 2F 61 31 30 7A 77 6B 55 78 51 55 53 2F 4C 59 2D 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 00
得到??为53(0x35)最终为:
82 35 00 0A 00 30 2F 73 79 73 2F 61 31 30 7A 77 6B 55 78 51 55 53 2F 4C 59 2D 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 00
现在我们通过网络调试助手来向阿里云服务端订阅主题
1.第一步向服务端发送connect报文确认是否连接成功,这一步和上一讲的操作相同
2.在连接成功后调试助手会显示服务器发送的连接成功的消息20 02 00 00,然后我们在发送我们刚刚算好的订阅消息报文:
82 35 00 0A 00 30 2F 73 79 73 2F 61 31 30 7A 77 6B 55 78
51 55 53 2F 4C 59 2D 31 2F 74 68 69 6E 67 2F 73 65 72 76
69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 00
服务端会返回一个90 03 00 0A 10确认订阅。当然如果你发送的订阅消息是错误的话,服务端返回的是90 03 00 0A 80,同时你的网络调试助手马上会断开。这时候你就要回去好好检查一下你的订阅报文是否计算的正确,直到服务器返回正确的回应才可以。
订阅确认
上面我们说在我们发送订阅报文之后服务器会马上返回订阅确认的消息:90 03 00 0A 10,那么为啥服务器返回的的是这几个值而不是其他的值呢?为啥返回了90 03 00 0A 10我们就知道订阅成功了呢?这就需要我们了解一下订阅确认的报文是怎么组成的。
同样,订阅确认的报文也由固定报头、可变报头、有效载荷组成的。
1.固定报头
2.可变报头
3.有效载荷
4.最终得到订阅确认的报文
知道了订阅确认报文的组成部分现在应该明白了为啥返回的订阅确认消息是90 03 00 0A 10了吧,哈哈。是不是感觉很奇妙!
5.程序设计
/*-------------------------------------*/
/*函数名:SUBSCRIBE订阅topic报文 */
/*参 数:QoS:订阅等级 */
/*参 数:topic_name:订阅topic报文名称 */
/*返回值:无 */
/*-------------------------------------*/
void MQTT_Subscribe(char *topic_name, int QoS)
{
Fixed_len = 2; //SUBSCRIBE报文中,固定报头长度=2 80+??
Variable_len = 2; //SUBSCRIBE报文中,可变报头长度=2 00+0A
Payload_len = 2 + strlen(topic_name) + 1; //计算有效负荷长度 = 2字节(topic_name长度)+ topic_name字符串的长度 + 1字节服务等级00
temp_buff[0]=0x82; //第1个字节 :固定0x82
temp_buff[1]=Variable_len + Payload_len; //第2个字节 :可变报头+有效负荷的长度
temp_buff[2]=0x00; //第3个字节 :报文标识符高字节,固定使用0x00
temp_buff[3]=0x01; //第4个字节 :报文标识符低字节,固定使用0x01
temp_buff[4]=strlen(topic_name)/256; //第5个字节 :topic_name长度高字节
temp_buff[5]=strlen(topic_name)%256; //第6个字节 :topic_name长度低字节
memcpy(&temp_buff[6],topic_name,strlen(topic_name)); //第7个字节开始 :复制过来topic_name字串
temp_buff[6+strlen(topic_name)]=QoS; //最后1个字节:订阅等级
TxDataBuf_Deal(temp_buff, Fixed_len + Variable_len + Payload_len); //加入发送数据缓冲区
}
END